home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Scope / Scope Disk #010 (199x)(Scope PD)(US)[WB].zip / Scope Disk #010 (199x)(Scope PD)(US)[WB].adf / BlitLab3 / math.c < prev    next >
C/C++ Source or Header  |  1988-05-14  |  4KB  |  177 lines

  1. /*
  2.  *   This is the math routines of BlitLab.  It checks a possible blit to
  3.  *   insure that it is safe.  It also handles the line calculations.
  4.  */
  5. #include "structures.h"
  6. /*
  7.  *   The externals we use.
  8.  */
  9. extern long gvals[] ;
  10. extern struct Gadget *gadgets[] ;
  11. extern short *realbits ;
  12. extern struct Window *mywindow ;
  13. extern char errorbuf[] ;
  14. /*
  15.  *   This routine insures that a blit is safe.  It returns 1 if it is
  16.  *   okay, and 0 if it is not.
  17.  */
  18. int blitsafe() {
  19.    long x1, x2, x3, x4 ;
  20.    long lower, upper ;
  21.  
  22.    if (gvals[GDGUSED]==0)
  23.       return(1) ;
  24.    lower = (long)realbits ;
  25.    upper = 382 + (long)realbits ;
  26.    if (gvals[GDGH] < 1 || gvals[GDGV] < 1
  27.        || gvals[GDGH] > 64 || gvals[GDGV] > 1024)
  28.       return(0) ;
  29.    if (gvals[GDGLINE]) {
  30.    } else {
  31.       x1 = gvals[GDGDPT] ;
  32.       if (gvals[GDGDESC]) {
  33.          x2 = x1 - gvals[GDGH] * 2 + 2 ;
  34.          x3 = x1 - (gvals[GDGV] - 1) * ((gvals[GDGH] * 2) +
  35.                     (gvals[GDGDMOD] & ~1)) ;
  36.          x4 = x3 - gvals[GDGH] * 2 + 2 ;
  37.          if (x1 < lower || x2 < lower || x3 < lower || x4 < lower ||
  38.              x1 > upper || x2 > upper || x3 > upper || x4 > upper)
  39.             return(0) ;
  40.          else
  41.             return(1) ;
  42.       } else {
  43.          x2 = x1 + gvals[GDGH] * 2 - 2 ;
  44.          x3 = x1 + (gvals[GDGV] - 1) * ((gvals[GDGH] * 2) + 
  45.                         (gvals[GDGDMOD] & ~1)) ;
  46.          x4 = x3 + gvals[GDGH] * 2 - 2 ;
  47.          if (x1 < lower || x2 < lower || x3 < lower || x4 < lower ||
  48.              x1 > upper || x2 > upper || x3 > upper || x4 > upper)
  49.             return(0) ;
  50.          else
  51.             return(1) ;
  52.       }
  53.    }
  54. }
  55. /*
  56.  *   This routine stuffs a value in a gadget.  Could be dangerous, but
  57.  *   that's life.
  58.  */
  59. stuff(id, s)
  60. int id ;
  61. char *s ;
  62. {
  63.  
  64.  
  65.  
  66.    gvals[id] = parse(s) ;
  67.    RemoveGadget(mywindow, gadgets[id]) ;
  68.    strcpy(((struct StringInfo *)(gadgets[id]->SpecialInfo))->Buffer, s) ;
  69.    AddGadget(mywindow, gadgets[id], -1) ;
  70.    RefreshGadgets(gadgets[id], mywindow, NULL) ;
  71. }
  72. /*
  73.  *   This routine flips the state of a toggle gadget.
  74.  */
  75. flipgadg(id)
  76. int id ;
  77. {
  78.    struct IntuiText *temp ;
  79.    struct Gadget *gp = gadgets[id] ;
  80.  
  81.    RemoveGadget(mywindow, gp) ;
  82.    temp = gp->GadgetText ;
  83.    gp->GadgetText = (struct IntuiText *)gp->UserData ;
  84.    gp->UserData = (APTR)temp ;
  85.    gp->NextGadget = NULL ;
  86.    AddGadget(mywindow, gp, -1) ;
  87.    RefreshGadgets(gp, mywindow, NULL) ;
  88.    gvals[id] = 1 - gvals[id] ;
  89. }
  90. /*
  91.  *   This routine sets up a line.
  92.  */
  93. setupline() {
  94.    int x, y ;
  95.    int i ;
  96.    int X, Y ;
  97.    int q = 0 ;
  98.  
  99.    parseall() ;
  100.    stuff(GDGADAT, "$8000") ;
  101.    stuff(GDGBDAT, "$ffff") ;
  102.    x = gvals[GDGSX] ;
  103.    y = gvals[GDGSY] ;
  104.    sprintf(errorbuf, "%d", x & 15) ;
  105.    stuff(GDGASH, errorbuf) ;
  106.    i = ((x >> 3) & ~1) + y * 12 ;
  107.    sprintf(errorbuf, "M+%d", i) ;
  108.    stuff(GDGCPT, errorbuf) ;
  109.    stuff(GDGDPT, errorbuf) ;
  110.    stuff(GDGCMOD, "12") ;
  111.    stuff(GDGDMOD, "12") ;
  112.    stuff(GDGH, "2") ;
  113.    x = (gvals[GDGEX] - gvals[GDGSX]) ;
  114.    y = (gvals[GDGEY] - gvals[GDGSY]) ;
  115.    if (x < 0)
  116.       X = - x ;
  117.    else
  118.       X = x ;
  119.    if (y < 0)
  120.       Y = - y ;
  121.    else
  122.       Y = y ;
  123.    if (x > 0) {
  124.       if (y > 0) {
  125.          q = (X > Y ? 1 : 0) ;
  126.       } else {
  127.          q = (X > Y ? 3 : 4) ;
  128.       }
  129.    } else {
  130.       if (y > 0) {
  131.          q = (X > Y ? 5 : 2) ;
  132.       } else {
  133.          q = (X > Y ? 7 : 6) ;
  134.       }
  135.    }
  136.    if (Y > X) {
  137.       i = X ;
  138.       X = Y ;
  139.       Y = i ;
  140.    }
  141.    sprintf(errorbuf, "%d", X+1) ;
  142.    stuff(GDGV, errorbuf) ;
  143.    sprintf(errorbuf, "%d", 4 * Y - 2 * X) ;
  144.    stuff(GDGAPT, errorbuf) ;
  145.    if (2 * Y - X < 0) {
  146.       if (!gvals[GDGSIGN])
  147.          flipgadg(GDGSIGN) ;
  148.    } else {
  149.       if (gvals[GDGSIGN])
  150.          flipgadg(GDGSIGN) ;
  151.    }
  152.    sprintf(errorbuf, "%d", 4 * (Y - X)) ;
  153.    stuff(GDGAMOD, errorbuf) ;
  154.    sprintf(errorbuf, "%d", 4 * Y) ;
  155.    stuff(GDGBMOD, errorbuf) ;
  156.    stuff(GDGAFWM, "%1111111111111111") ;
  157.    stuff(GDGALWM, "%1111111111111111") ;
  158.    if (! gvals[GDGLINE])
  159.       flipgadg(GDGLINE) ;
  160.    if ((q & 1) != gvals[GDGEFE])
  161.       flipgadg(GDGEFE) ;
  162.    if (((q >> 1) & 1) != gvals[GDGIFE])
  163.       flipgadg(GDGIFE) ;
  164.    if (((q >> 2) & 1) != gvals[GDGFCI])
  165.       flipgadg(GDGFCI) ;
  166.    if (! gvals[GDGUSEA])
  167.       flipgadg(GDGUSEA) ;
  168.    if (gvals[GDGUSEB])
  169.       flipgadg(GDGUSEB) ;
  170.    if (! gvals[GDGUSEC])
  171.       flipgadg(GDGUSEC) ;
  172.    if (! gvals[GDGUSED])
  173.       flipgadg(GDGUSED) ;
  174.    if (gvals[GDGOVF])
  175.       flipgadg(GDGOVF) ;
  176. }
  177.